﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.IO;
using System.Drawing;
using System.Globalization;
using System.ComponentModel;
using System.Data;
using System.Windows.Forms;

namespace ProyectoPractico
{
    class PesosCapa
    {
        //atributos
        //private ArrayList pesosPorNeuronas;
        //private double[,] pesosPorNeuronas;//esta matriz va a representar Filas=Neuronas   Columnas=Pesos
        private int cantNeuronas = 0;
        private int cantPesos = 0;
        private int pesosOcupados = 0;
        ArrayList pesosPorNeuronas;


        //métodos
        //PesosCapa-----------------------------------------------------------------------------------------------------------------------
        public PesosCapa(int newronas)
        {//, int pesos){//este es el constructor de la clase 
            cantNeuronas = newronas;
            cantPesos = newronas;
            //pesosPorNeuronas = new double[newronas, newronas];
            pesosPorNeuronas = new ArrayList();
            
            for (int neuronaTemp = 0; neuronaTemp < newronas; neuronaTemp++)
            {// con estos for anidados inicializo la matriz de pesos
                ArrayList neurona = new ArrayList();                
                pesosPorNeuronas.Add(neurona);
            }
            incrementarPesosOcupados();
        }

        //getPeso-----------------------------------------------------------------------------------------------------------------------
        public double getPeso(int neuronaT, int pesoReq)
        {// este metodo devuelve el peso especificado de una neurona identificada
            ArrayList neuro = (ArrayList)(pesosPorNeuronas[neuronaT]);
            double numero = (double)neuro[pesoReq];
            return numero;
        }

        //setPeso-----------------------------------------------------------------------------------------------------------------------
        public void setPeso(int neuronaT, int pesoT, double newPeso)
        {//este metodo guarda el peso deseado de una neurona debidamente identificada
            ((ArrayList)pesosPorNeuronas[neuronaT])[pesoT]=newPeso ;
        }

        //guardarPesos-----------------------------------------------------------------------------------------------------------------------
        public void guardarPesos(string nombreArchivo)
        {
            try
            {
                FileStream fileStream = new FileStream(nombreArchivo, FileMode.Create, FileAccess.Write);
                StreamWriter archivo = new StreamWriter(fileStream);

                string guardar = cantNeuronas.ToString();
                archivo.Write(guardar);
                archivo.Write(Environment.NewLine);
                guardar = pesosOcupados.ToString();
                archivo.Write(guardar);
                archivo.Write(Environment.NewLine);

                for (int a = 0; a < cantNeuronas; a++)
                {
                    for (int b = 0; b < pesosOcupados; b++)
                    {
                        guardar = ((double)((ArrayList)pesosPorNeuronas[a])[b]).ToString();
                        archivo.Write(guardar);
                        archivo.Write(Environment.NewLine);
                    }
                }
                archivo.Dispose();
                archivo.Close();
                fileStream.Close();
            }catch(Exception e){
                MessageBox.Show("Se produjo un error con el archivo, intente nuevamente!", "Pesos", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        //cargarPesos-----------------------------------------------------------------------------------------------------------------------
        public void cargarPesos(string nombreArchivo)
        {
            pesosPorNeuronas = new ArrayList();
            FileStream fileStream = new FileStream(nombreArchivo, FileMode.Open, FileAccess.Read);
            StreamReader archivo = new StreamReader(fileStream);
            
            cantNeuronas  = Int32.Parse(archivo.ReadLine());
            pesosOcupados = Int32.Parse(archivo.ReadLine());

            for (int a = 0; a < cantNeuronas; a++)
            {
                ArrayList neurona = new ArrayList();
                for (int b = 0; b < pesosOcupados; b++)
                {
                    
                   neurona.Insert(b, double.Parse(archivo.ReadLine()));
                   
                }
                pesosPorNeuronas.Add(neurona);
            }
            archivo.Close();
        }
        public void incrementarPesosOcupados() {
            //cantNeuronas
            for (int pesoTemp = 0; pesoTemp < cantPesos; pesoTemp++)
            {
                /* //pesosPorNeuronas[neuronaTemp, pesoTemp] = 1;
                neurona.Add(1.0);*/
                ((ArrayList)pesosPorNeuronas[pesoTemp]).Insert(pesosOcupados,1.0);
            }
            
            pesosOcupados++;
        }
        public int getPesosocupados()
        {
            return pesosOcupados;
        }
        public int getCantNeuronas()
        {
            return cantNeuronas;
        }

    }//fin de la clase
}
